iT邦幫忙

2024 iThome 鐵人賽

DAY 24
0
Security

密碼學小白的學習之路系列 第 24

[Day 24] 題目(Symmetric-8) & ECB 簡單介紹

  • 分享至 

  • xImage
  •  

Modes of Operation Starter

https://cryptohack.org/courses/symmetric/block_cipher_starter/

題目敘述摘要:

上一題我們學到了 AES 如何對一個數據塊進行加密排列,然而在實際應用中,常常會需要加密長於單個數據塊的訊息。
所以接下來就會介紹如何在較長的訊息上使用像 AES 這樣的加密算法。

然後題目要我們到另一個網站完成這題的挑戰:
https://aes.cryptohack.org/block_cipher_starter/
https://ithelp.ithome.com.tw/upload/images/20240830/20168165kMShHMg0nY.png
這個網站給了我們 source code、 DECRYPT(CIPHERTEXT) 解密密文、ENCRYPT_FLAG() 加密flag 、 xor tool 以及 hex 的加密解密器

題目給的 source code 與註解

可以大概了解一下加密與解密的過程

from Crypto.Cipher import AES  # 引入 AES 加密模組


KEY = ?  
FLAG = ?  


@chal.route('/block_cipher_starter/decrypt/<ciphertext>/')
def decrypt(ciphertext):
    ciphertext = bytes.fromhex(ciphertext) # 將密文由 hex 字串轉為 bytes
    # 使用指定的密鑰和 ECB 模式來建立 AES 加密器
    cipher = AES.new(KEY, AES.MODE_ECB)
    try:
        # 嘗試解密密文
        decrypted = cipher.decrypt(ciphertext)
        # 如果解密過程中出現錯誤,返回錯誤信息
    except ValueError as e:
        return {"error": str(e)} 
   
    return {"plaintext": decrypted.hex()}  # 將解密後的明文轉換為 hex 字串並返回

# 加密端點,將 FLAG 進行加密
@chal.route('/block_cipher_starter/encrypt_flag/')
def encrypt_flag():
    # 使用指定的密鑰和 ECB 模式來建立 AES 加密器
    cipher = AES.new(KEY, AES.MODE_ECB)
    encrypted = cipher.encrypt(FLAG.encode())     # 將 FLAG 轉換為 bytes 並進行加密
    return {"ciphertext": encrypted.hex()}  # 將加密後的密文轉換為 hex 字符串並返回

解法:

先按一下 ENCRYPT_FLAG() 的 submit,就會得到:

{"ciphertext":"0bf3da3fce245ce6bd6c9a9abaaef49945bbf20ec314ca38b341707c36bd00b9"}

根據 source code,我們可以知道 0bf3da3fce245ce6bd6c9a9abaaef49945bbf20ec314ca38b341707c36bd00b9 這串是加密後的密文(而且是 hex 格式)。
然後確認一下,嗯好的,解密的函式所需要輸入的密文格式也是 hex,所以就直接複製密文到解密那欄,然後 submit,接下來就會得到:

{"plaintext":"63727970746f7b626c30636b5f633170683372355f3472335f663435375f217d"}

再把明文那串(637.........217d)丟到 hex 的解碼器就可以得到flag了!

crypto{bl0ck_c1ph3r5_4r3_f457_!}
(block_ciphers_are_fast_!)

ECB 簡單介紹

前情提要:

分組加密模式(Block Cipher Mode of Operation):
將數據分成固定大小的塊,然後對每個塊進行獨立加密。所以明文會被拆分成多個大小相同的塊,並在加密算法處理後,各自生成對應的密文塊。
常見的分組加密有很多種模式,像是ECB,CBC,CFB,OFB等等
我看了一下後面的題目,好像會講到CBC和OFB,所以今天就先介紹ECB就好~~(絕對不是想偷懶XD)~~

電子密碼本:Electronic Code Book Mode (ECB)

https://ithelp.ithome.com.tw/upload/images/20240830/20168165hRN3s8OOLM.png

  • 最簡單的一種分組加密模式
  • 適合加密短資料(如加密金鑰),且較沒有重複情況發生時
  • 將數據分成固定大小的塊,並對每個塊單獨加密。
  • 相同的明文塊會被加密為相同的密文塊,因而容易被識別,不適合加密相似或具有重複性質的數據。
    (像是下圖這隻經過AES加密的linux企鵝,加密後仍然能清楚看出它原來的模樣。)
    https://ithelp.ithome.com.tw/upload/images/20240830/20168165LhMOnMfHuJ.png

參考資料:

加密模式詳細介紹: https://ithelp.ithome.com.tw/articles/10249953
塊加密工作模式(企鵝圖出處): https://blog.csdn.net/jerry81333/article/details/78336616
也有提到塊加密的英文內容:
https://github.com/francisrstokes/githublog/blob/main/2022/6/15/rolling-your-own-crypto-aes.md

後話:

今天在看分組加密的內容時發現,好像在哪裡看過,原來就是昨天題目附的參考資料,裡面也有linux企鵝經過不同塊加密運作會有的差異。今天最大的收穫大概就是發現原來塊加密有分這麼多種。甚至和區塊鏈加密有關。


上一篇
[Day 23] 題目(Symmetric-7)
下一篇
[Day 25] 題目(Symmetric-9)
系列文
密碼學小白的學習之路31
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言